在java中,为什么字节类型可以使用&0xff执行无符号右移操作?
我知道,在Java中,字节类型在进行右移操作之前,会首先转换为int类型
因此,在Java中,我们将得到字节类型的错误答案>>>;行动
比如
byte b=(byte)0xf1;
byte c=(byte)(b>>4);
byte d=(byte)(b>>>4);
byte e=(byte)((b&0xff)>>4);
d的答案等于c,但e的答案是正确的。我想不出原因
谢谢
你可以在下面搜索框中键入要查询的问题!
我知道,在Java中,字节类型在进行右移操作之前,会首先转换为int类型
因此,在Java中,我们将得到字节类型的错误答案>>>;行动
比如
byte b=(byte)0xf1;
byte c=(byte)(b>>4);
byte d=(byte)(b>>>4);
byte e=(byte)((b&0xff)>>4);
d的答案等于c,但e的答案是正确的。我想不出原因
谢谢
# 1 楼答案
您自己回答了问题“在进行右移操作之前,将首先转换为int类型”,所以
首先
然后
然后
# 2 楼答案
如前所述,Java总是使用
int
或更大的值进行计算,所以考虑^ {< CD2>}(注意上面的位被设置,所以^ {< CD3>}实际上是-15)
隐式转换为int:
(int)b = 1111 .... 1111 0001
右移:
(b>>4) = 1111 1111 .... 1111 1111
(b>>>4) = 0000 1111 .... 1111 1111
向布尔显式施放:
c = d = 1111 1111
考虑^ {CD8>}
隐式转换为int:
(int)b = 1111 .... .... 1111 0001
使用0xff时:
x&0xff = 0000 .... 0000 1111 0001
右移:
(b&0xff)>>4 = 0000 .... 0000 1111
显式转换为字节:
e = 0000 1111
# 3 楼答案
java中最小的类型是int,部分原因是现在CPU使用整数或更大的类型。 因此,JVM是基于int实现的,而其他较小的数据类型(如byte、char、boolean)只是为了方便而添加的
所以,当你做比特运算时,你可以享受你提到的不一致性